#ifndef __WORKER_H__
#define __WORKER_H__
#include "../../log/systemLog/systemLog.h"
#include "taskQueue/taskQueue.h"

#include <pthread.h>

// 工作线程列表
typedef struct worker_list_s
{
    pthread_t *workers; // 工作线程数组指针
    int worker_count;   // 工作线程数量
} worker_list_t;

typedef struct shared_data_s
{
    task_queue_t task_queue;     // 任务队列
    pthread_mutex_t queue_mutex; // 任务队列互斥锁
    pthread_cond_t queue_cond;   // 任务队列条件变量
    int exit_flag;               // 退出标志 0 - 不退出，1 - 退出
} shared_data_t;

/**
 * @brief 初始化工作线程列表
 *
 * @param worker_list 工作线程列表指针
 * @param worker_count 工作线程数量
 * @return int 初始化结果，成功返回 SYSTEM_ERR_OK，参数错误返回 SYSTEM_ERR_INVALID_ARGUMENT，内存分配失败返回 SYSTEM_ERR_OUT_OF_MEMORY
 */
int worker_list_init(worker_list_t *worker_list, int worker_count);

/**
 * @brief 创建工作线程
 *
 * @param worker_list 工作线程列表指针
 * @param shared_data 共享数据指针
 * @return int 创建结果，成功返回 SYSTEM_ERR_OK，参数错误返回 SYSTEM_ERR_INVALID_ARGUMENT，线程创建失败返回 SYSTEM_ERR_WORKER_THREAD_CREATE
 */
int make_workers(worker_list_t *worker_list, shared_data_t *shared_data);

// 这些宏只记录错误但不改变控制流
// 初始化工作线程列表返回值检查：-1 参数错误, -2 内存分配失败
#define WORKER_LIST_INIT_CHECK(ret)                                          \
    do                                                                       \
    {                                                                        \
        system_error_code_t _ret = (ret);                                    \
        if (_ret != SYSTEM_ERR_OK)                                           \
        {                                                                    \
            system_error_code_t _serr = (_ret == SYSTEM_ERR_OUT_OF_MEMORY)   \
                                            ? SYSTEM_ERR_OUT_OF_MEMORY       \
                                            : SYSTEM_ERR_INVALID_ARGUMENT;   \
            SYSTEM_LOG_ERROR(_serr, "worker_list_init failed ret=%d", _ret); \
        }                                                                    \
    } while (0)

// 创建工作线程返回值检查：-1 参数错误, -2 线程创建失败
#define MAKE_WORKERS_CHECK(ret)                                                   \
    do                                                                            \
    {                                                                             \
        system_error_code_t _ret = (ret);                                         \
        if (_ret != SYSTEM_ERR_OK)                                                \
        {                                                                         \
            system_error_code_t _serr = (_ret == SYSTEM_ERR_WORKER_THREAD_CREATE) \
                                            ? SYSTEM_ERR_WORKER_THREAD_CREATE     \
                                            : SYSTEM_ERR_INVALID_ARGUMENT;        \
            SYSTEM_LOG_ERROR(_serr, "make_workers failed ret=%d", _ret);          \
        }                                                                         \
    } while (0)

#endif // __WORKER_H__